/*******************************************************************************
*                                                                              *
* This file provides a TSP SC implementation's functions  plugin.              *
*                                                                              *
*******************************************************************************/

#ifndef __ANN_PLUGIN_H__
#define __ANN_PLUGIN_H__

////////////////////////////////////////////////////////////////////////////////
// Includes
////////////////////////////////////////////////////////////////////////////////

#include "SCSystem.hpp"
#include "SC_ANN_LibConfig.h"

////////////////////////////////////////////////////////////////////////////////
// Prototypes
////////////////////////////////////////////////////////////////////////////////

/**
 *	Initialises the plugin.
 *	This function is called when a plugin is loaded to initialise some data
 *	(like loading a file) before computation starts.
*/
LIBRARY_DECL void InitPlugin (const std::string &);

/**
 *	Closes the plugin properly.
 *	This function is called when a plugin is closed to finalise some data (like 
 *	closing a file or free memory) when computation ends.
*/
LIBRARY_DECL void ClosePlugin (void);

/**
 *	Transfer data between from the universe to the network
 *	@param sys1 System 1 : Universe
 *	@param context Context system : InputTransfer
 *	@param sys2 System 2 : Axon
*/
LIBRARY_DECL bool InputTransfer (SC::SCSystem &, const SC::SCSystem &, SC::SCSystem &);

/**
 *	Synapse signal processing.
 *	@param sys1 System 1 : Axon
 *	@param context Context system : Synapse
 *	@param sys2 System 2 : Dendrites
*/
LIBRARY_DECL bool Synapse (SC::SCSystem &, SC::SCSystem &, SC::SCSystem &);

/**
 *	Membrane signal processing.
 *	@param sys1 System 1 : Dendrites
 *	@param context Context system : Membrane
 *	@param sys2 System 2 : Axon
*/
LIBRARY_DECL bool Membrane (SC::SCSystem &, SC::SCSystem &, SC::SCSystem &);

/**
 *	Transfer data between from the network to the universe
 *	@param sys1 System 1 : Axon
 *	@param context Context system : OutputTransfer
 *	@param sys2 System 2 : Universe
*/
LIBRARY_DECL bool OutputTransfer (SC::SCSystem &, const SC::SCSystem &, SC::SCSystem &);

////////////////////////////////////////////////////////////////////////////////

#endif
